5 Importar base de datos

5.1 Cargar de datos

Ahora demostraremos como cargar la data tanto para r-studio de escritorio como para R- cloud (versión online).

5.1.1 Desde R-Studio de escritorio

Para importar bases de datos en formato Excel en R- studio se ingresa en la ventana 2 en donde dice Import Dataset como se observa en la siguiente imagen.

{r echo=FALSE, out.width = “960x,” out.height=“205px,”fig.align=‘center’} knitr::include_graphics(“~/imagenes/imagen 5.1.1.PNG”)

Luego aparece una ventana en donde buscamos nuestra base de datos en nuestro computador, y una vez seleccionado el archivo aparece una segunda ventana llamada Import Dataset como se muestra en las dos siguientes imágenes. En la primera es la forma correcta de subir la base de datos como se encuentra demarcado el Heading colocamos YES esto es con el fin de que la base de datos que subamos tenga el encabezado correspondiente como se encuentra demostrado en la imagen.

{r echo=FALSE, out.width = “732px,” out.height=“609px,”fig.align=‘center’} knitr::include_graphics(“C:/Users/nicol/OneDrive/Escritorio/imagenes/imagen 5.1.1(2).PNG”)

De lo contrario se puede ver en la imagen dos lo que sucede si ponemos NO en donde el encabezado se muestra como una observación más.

{r echo=FALSE, out.width = “732px,” out.height=“609px,”fig.align=‘center’} knitr::include_graphics(“C:/Users/nicol/OneDrive/Escritorio/imagenes/imagen 5.1.1(3).PNG”)

Una vez importada la base de datos podemos ver que aparece como Data Frame en la ventana 2, en esta también nos muestra características básicas como la cantidad de observaciones que posee el Data Frame. También se puede observar en la consola que se importó el archivo correctamente, es recomendable copiar y pegar en el script lo demarcado , así cada vez que queramos trabajar se subirá automáticamente la base de datos.

{r echo=FALSE, out.width = “800px,” out.height=“300px,”fig.align=‘center’} knitr::include_graphics(“C:/Users/nicol/OneDrive/Escritorio/imagenes/imagen 5.1.1(4).PNG”)

5.1.2 Desde R-cloud

En cuanto a R-Cloud se suben los archivos un poco diferentes, en este nos tenemos que dirigir la ventana 4 en donde dice Upload, esto abrirá una ventana llamada Target directory presionamos donde die elegir archivo, con esto nos abre otra ventana en donde debemos buscar el archivo que dejamos importar.

{r echo=FALSE, out.width = “956px,” out.height=“516px,”fig.align=‘center’} knitr::include_graphics(“C:/Users/nicol/OneDrive/Escritorio/imagenes/imagen 5.1.2.PNG”)

Esto creara un archivo en la ventana 4 como se muestra en la siguiente imagen. Y ahora se procede a realizar la importación del archivo en la segunda ventana como se realiza en R- Studio.

{r echo=FALSE, out.width = “920px,” out.height=“471px,”fig.align=‘center’} knitr::include_graphics(“C:/Users/nicol/OneDrive/Escritorio/imagenes/imagen 5.1.2(2).PNG”)

5.2 Tibbles

Los tibbles son data frames, pero modifican algunas características, y podemos destacar dos diferencias principales entre el uso de un tibble y un data.frama clásico: la impresión en la consola y la selección de los subconjuntos. Los tibbles tienen un método de impresión en la consola más abreviado ya que solo muestran las primeras 10 filas y solo aquellas columnas que entran en el ancho de la pantalla. Por lo que esto facilitaría el trabajo con bases de datos grandes. Además del nombre, cada columna muestra su tipo. Esto último es una gran característica tomada de str().

En cuento a la selección de subconjuntos, Si quieres recuperar una variable individual, necesitas algunas herramientas nuevas: $ y [[. Mientras que [[ permite extraer variables usando tanto su nombre como su posición, con $ sólo se puede extraer mediante el nombre. La única diferencia es que $ implica escribir un poco menos.

https://es.r4ds.hadley.nz/tibbles.html

5.3 Unir data frames en R

Cuando se trabaja con grandes cantidades de datos, a veces es necesario combinar bases de datos para consolidarlo en una que contenga toda la información. En este capítulo veremos diferente forma de realizar datos relacionales, pero primero hay que tener en cuenta la siguiente recomendación:

  • Debes extraer los datos básicos de cada base de datos como.
  • La cantidad de filas y columnas por cada base de datos.
  • De qué tipo son las columnas, por ejemplo, si son numéricas o carácter .
  • Revisar cuidadosamente la visualización de la base de datos para observar si existen algún punto en común entre las bases de datos.
  • Debes conocer que representa cada variable de base de datos.
  • luego realiza un diagrama para ver las variables en común.

Como se observa en la siguiente imagen.

En segundo lugar, hay que tener en cuenta las tres familias de verbos diseñados para trabajar con datos relacionales:

  • filtering joins (Filtrado de combinaciones) , que filtran las observaciones de un marco de datos en función de si coinciden o no con una observación de la otra tabla.
  • set operations (Establecer operaciones) , que tratan las observaciones como si fueran elementos establecidos.
  • mutating joins (Uniones de trasformación) , que agregan nuevas variables a un marco de datos a partir de observaciones coincidentes en otro.

5.3.1 mutating joins (Uniones de trasformación)

Esta busca combinar variables a partir de dos tablas, en la que busca coincidencias de observaciones de acuerdo con su put y luego copia las variables de una tabla en la otra.

Tal como mutate(), las funciones de unión agregan variables hacia la derecha, por lo que, si tienes muchas variables inicialmente, las nuevas variables no se imprimirán.

Uno de los más simples es a través de mage() para hacer cruces de tablas imagen

{r echo=FALSE, out.width = “775px,” out.height=“230px,”fig.align=‘center’} knitr::include_graphics(“C:/Users/nicol/OneDrive/Escritorio/imagenes/imagen 5.3.1.PNG”)

Para ello crearemos 2 bases baseA y baseB con una llave o columna en común ID.

baseA
##   ID  A
## 1  1 x1
## 2  2 x2
## 3  3 x3
## 4  4 x4
## 5  5 x5
## 6  6 x6
baseB
##   ID  B
## 1  1 y1
## 2  2 y2
## 3  3 y3
## 4  4 y4
## 5  5 y5
## 6  6 y6

Para unir la baseA y en la baseB utilizaremos merge() para crear la base AB.

baseAB = merge(baseA, baseB, by = "ID")
baseAB
##   ID  A  B
## 1  1 x1 y1
## 2  2 x2 y2
## 3  3 x3 y3
## 4  4 x4 y4
## 5  5 x5 y5
## 6  6 x6 y6

5.3.1.1 Unión interior

La forma más simple de unión es la unión interior (del inglés inner join). Como se muestra en la siguiente imagen:

Pero primero crearemos 3 vectores ID, A y B para luego crear un baseA y baseB.

A continuación, en vez de crear un base llamada baseAB se concatena la baseA con la baseB para llamarse baseA.

baseA %>%
  inner_join(baseB, by = "ID")
##   ID  A  B
## 1  1 x1 y1
## 2  2 x2 y2
## 3  3 x3 y3
## 4  4 x4 y4
## 5  5 x5 y5
## 6  6 x6 y6

Como se observas se unieron las baseA y baseB, una unión interior mantiene las observaciones que aparecen en ambas tablas.

5.3.1.2 Uniones exteriores

Una unión exterior mantiene las observaciones que aparecen en al menos una de las tablas. Existen tres tipos de uniones exteriores:

  • Una unión izquierda left_join() mantiene todas las observaciones en x.

{r echo=FALSE, out.width = “775px,” out.height=“230px,”fig.align=‘center’} knitr::include_graphics(“C:/Users/nicol/OneDrive/Escritorio/imagenes/imagen 5.3.1.2.PNG”)

baseA %>%
  left_join(baseB, by = "ID")
##   ID  A    B
## 1  1 x1   y1
## 2  2 x2   y2
## 3  3 x3 <NA>
## 4  4 x4   y4
## 5  5 x5   y5
## 6  6 x6   y6
  • Una unión derecha right_join() mantiene todas las observaciones en y.

{r echo=FALSE, out.width = “775px,” out.height=“230px,”fig.align=‘center’} knitr::include_graphics(“C:/Users/nicol/OneDrive/Escritorio/imagenes/imagen 5.3.1.2.(2).PNG”)

baseA %>%
  right_join(baseB, by = "ID")
##   ID    A  B
## 1  1   x1 y1
## 2  2   x2 y2
## 3  3   x3 y3
## 4  5   x5 y5
## 5  6   x6 y6
## 6  4 <NA> y4
  • Una unión completa full_join() mantiene todas las observaciones en x e y. observaciones en y.

{r echo=FALSE, out.width = “775px,” out.height=“230px,”fig.align=‘center’} knitr::include_graphics(“C:/Users/nicol/OneDrive/Escritorio/imagenes/imagen 5.3.1.2.(3).PNG”)

baseA %>%
  full_join(baseB, by = "ID")
##   ID    A    B
## 1  1   x1   y1
## 2  2   x2   y2
## 3  4   x4   y4
## 4  5   x5 <NA>
## 5  6   x6   y6
## 6  3 <NA>   y3

5.3.1.3 claves duplicadas

Pero que sucede si la id esta duplicada ¿cómo podemos unirlas? para ellos nos pondremos en dos escenarios diferentes.

  • El primero en una tabla tiene claves duplicadas. Esto es útil cuando quieres agregar información adicional dado que típicamente existe una relación uno a muchos.

{r echo=FALSE, out.width = “775px,” out.height=“230px,”fig.align=‘center’} knitr::include_graphics(“C:/Users/nicol/OneDrive/Escritorio/imagenes/A5.PNG”)

baseA %>%
  left_join(baseB, by = "ID")
##   ID  A  B
## 1  1 x1 y1
## 2  2 x2 y2
## 3  1 x3 y1
## 4  2 x4 y2
  • Ambas tablas tienen claves duplicadas. Esto es usualmente un error debido a que en ninguna de las tablas las claves identifican de manera única una observación. Cuando unes claves duplicadas, se obtienen todas las posibles combinaciones, es decir, el producto cartesiano:

{r echo=FALSE, out.width = “775px,” out.height=“230px,”fig.align=‘center’} knitr::include_graphics(“C:/Users/nicol/OneDrive/Escritorio/imagenes/A6.PNG”)

baseA %>%
  left_join(baseB, by = "ID")
##   ID  A  B
## 1  1 x1 y1
## 2  2 x2 y2
## 3  2 x2 y3
## 4  2 x3 y2
## 5  2 x3 y3
## 6  3 x4 y4

5.3.1.4 otras formas

con dplyr con merge
inner_join(base1, base2) merge(base1, base2)
full_join(base1, base2) merge(base1, base2, all.x = TRUE, all.y = TRUE)
right_join(base1, base2) merge(base1, base2, all.y = TRUE)
left_join(base1, base2) merge(base1, base2, all.x = TRUE)

La ventaja de los verbos específicos de dplyr es que muestran de manera clara la intención del código: la diferencia entre las uniones es realmente importante, pero se esconde en los argumentos de merge(). Las uniones de dplyr son considerablemente más rápidas y no generan problemas con el orden de las filas.

Si las variables clave tiene diferente nombre (solo cosas en común)

merge(base1, base2, by.x="nombre variable base 1", by.y="nombre variable base 2")

Si la variable se llame igual en las dos bases (solo cosas en común)

merge(base1, base2, by="nombre variable")

Si queremos que se unan todos los casos

all=TRUE: merge(base1, base2, by="nombre variable", all=TRUE)

Si queremos unir por más de una variable: (si las variables se llaman igual en ambas bases)

merge(base1, base2, by=c("variable1", "variable2"))

Si las variables se llaman diferente en ambas bases

merge(base1, base2, by.x=c("variable1", "variable2"), by.y=c("variable1", "variable2"))

Otras formas efectivas de realizar una unión de base son los siguientes códigos.

5.3.2 Uniones de filtros

Las uniones de filtro unen observaciones de la misma forma que las uniones de transformación, pero afectan a las observaciones no a las variables. Existen dos tipos:

  • semi_join(x, y) mantiene todas las observaciones en x con coincidencias en y.

{r echo=FALSE, out.width = “775px,” out.height=“230px,”fig.align=‘center’} knitr::include_graphics(“C:/Users/nicol/OneDrive/Escritorio/imagenes/A7.PNG”)

baseA %>%
  semi_join(baseB)
## Joining, by = "ID"
##   ID  A
## 1  1 x1
## 2  2 x2
## 3  4 x4
## 4  5 x5
  • anti_join(x, y) descarta todas las observaciones en x con coincidencias en y.

{r echo=FALSE, out.width = “775px,” out.height=“230px,”fig.align=‘center’} knitr::include_graphics(“C:/Users/nicol/OneDrive/Escritorio/imagenes/A8.PNG”)

baseA %>%
  anti_join(baseB)
## Joining, by = "ID"
##   ID  A
## 1  3 x3

Las semi uniones son útiles para unir tablas resumen previamente filtradas con las filas originales. Por ejemplo, imagina que encontraste los diez destinos más populares:

5.4 exploración de la data

Ahora lo realizaremos una exploración de la base de datos , en este caso usaremos la base de datos disponibles llamado AB_NYC_2019.csv, que se encuentra disponible en el siguiente link: https://www.kaggle.com/dgomonov/new-york-city-airbnb-open-data

Pero primero necesitamos la siguientes Liberia:

library(dplyr)
library(tidyr) 
library(readxl)

Importamos la base de datos a R-Studio como se vio en capítulos anteriores.

airbnb <- read.csv("imagenes/AB_NYC_2019.csv")

5.4.1 Inspección de una tabla

Luego realizamos la visualización de la data.

airbnb
## Warning in instance$preRenderHook(instance): It seems your data is too big
## for client-side DataTables. You may consider server-side processing: https://
## rstudio.github.io/DT/server.html

Ahora realizaremos una breve descripción de las columnas de la data :

Variable Descripción
id Código de hostal
name Nombre de Airbnb
host_id Código de Airbnb
host_name Nombre del anfitrión
neighbourhood_group Distritos de new york
neighbourhood Vecindarios de los distritos
latitude Coordenada latitud
longitude Coordenada de longitud
room_type Tipo de habitación
price Precio
minimum_nights cantidad mínima de noches para una reserva
number_of_reviews Numero de revisiones por mes
last_review Ultimas reseña
reviews_per_month Cantidad de comentarios por mes para la propiedad
calculated_host_listings_count Numero de anuncios
availability_365 número de días en los que la lista está disponible para la reserva.

Para obtener más información revisamos a través de los códigos como lo siguientes:

Queremos determinar si la base de datos posee algún problema usamos función problems().

problems(airbnb)
## [1] row      col      expected actual  
## <0 rows> (or 0-length row.names)

Para ver la cantidad de observaciones usaremos la función nrow().

nrow(airbnb)
## [1] 48895

Cuantas columnas o variables poseen la data con la función ncol().

ncol(airbnb)
## [1] 16

si queremos ver las primeras observaciones usamos la función head().

head(airbnb) # primeras seis filas
##     id                                             name host_id   host_name
## 1 2539               Clean & quiet apt home by the park    2787        John
## 2 2595                            Skylit Midtown Castle    2845    Jennifer
## 3 3647              THE VILLAGE OF HARLEM....NEW YORK !    4632   Elisabeth
## 4 3831                  Cozy Entire Floor of Brownstone    4869 LisaRoxanne
## 5 5022 Entire Apt: Spacious Studio/Loft by central park    7192       Laura
## 6 5099        Large Cozy 1 BR Apartment In Midtown East    7322       Chris
##   neighbourhood_group neighbourhood latitude longitude       room_type price
## 1            Brooklyn    Kensington 40.64749 -73.97237    Private room   149
## 2           Manhattan       Midtown 40.75362 -73.98377 Entire home/apt   225
## 3           Manhattan        Harlem 40.80902 -73.94190    Private room   150
## 4            Brooklyn  Clinton Hill 40.68514 -73.95976 Entire home/apt    89
## 5           Manhattan   East Harlem 40.79851 -73.94399 Entire home/apt    80
## 6           Manhattan   Murray Hill 40.74767 -73.97500 Entire home/apt   200
##   minimum_nights number_of_reviews last_review reviews_per_month
## 1              1                 9  2018-10-19              0.21
## 2              1                45  2019-05-21              0.38
## 3              3                 0                            NA
## 4              1               270  2019-07-05              4.64
## 5             10                 9  2018-11-19              0.10
## 6              3                74  2019-06-22              0.59
##   calculated_host_listings_count availability_365
## 1                              6              365
## 2                              2              355
## 3                              1              365
## 4                              1              194
## 5                              1                0
## 6                              1              129
tail(airbnb) # últimas seis filas
##             id                                              name   host_id
## 48890 36484363                                QUIT PRIVATE HOUSE 107716952
## 48891 36484665   Charming one bedroom - newly renovated rowhouse   8232441
## 48892 36485057     Affordable room in Bushwick/East Williamsburg   6570630
## 48893 36485431           Sunny Studio at Historical Neighborhood  23492952
## 48894 36485609              43rd St. Time Square-cozy single bed  30985759
## 48895 36487245 Trendy duplex in the very heart of Hell's Kitchen  68119814
##           host_name neighbourhood_group      neighbourhood latitude longitude
## 48890       Michael              Queens            Jamaica 40.69137 -73.80844
## 48891       Sabrina            Brooklyn Bedford-Stuyvesant 40.67853 -73.94995
## 48892       Marisol            Brooklyn           Bushwick 40.70184 -73.93317
## 48893 Ilgar & Aysel           Manhattan             Harlem 40.81475 -73.94867
## 48894           Taz           Manhattan     Hell's Kitchen 40.75751 -73.99112
## 48895    Christophe           Manhattan     Hell's Kitchen 40.76404 -73.98933
##             room_type price minimum_nights number_of_reviews last_review
## 48890    Private room    65              1                 0            
## 48891    Private room    70              2                 0            
## 48892    Private room    40              4                 0            
## 48893 Entire home/apt   115             10                 0            
## 48894     Shared room    55              1                 0            
## 48895    Private room    90              7                 0            
##       reviews_per_month calculated_host_listings_count availability_365
## 48890                NA                              2              163
## 48891                NA                              2                9
## 48892                NA                              2               36
## 48893                NA                              1               27
## 48894                NA                              6                2
## 48895                NA                              1               23

Si queremos saber los nombres las columnas o variables se usa la función colnames()

colnames(airbnb)
##  [1] "id"                             "name"                          
##  [3] "host_id"                        "host_name"                     
##  [5] "neighbourhood_group"            "neighbourhood"                 
##  [7] "latitude"                       "longitude"                     
##  [9] "room_type"                      "price"                         
## [11] "minimum_nights"                 "number_of_reviews"             
## [13] "last_review"                    "reviews_per_month"             
## [15] "calculated_host_listings_count" "availability_365"

5.4.2 Selección de filas y columnas

A veces queremos trabajar con un subconjunto de la tabla, como por ejemplo una selección de filas y/o columnas. Para este tipo de selecciones se usa el corchete [].

airbnb[1:5, ] # las 5 primeras filas 
airbnb[,3:4] # las 5 primeras filas 
## Warning in instance$preRenderHook(instance): It seems your data is too big
## for client-side DataTables. You may consider server-side processing: https://
## rstudio.github.io/DT/server.html

Como se observó los corchetes tienen dos partes separadas por una coma la que la precede se refiere a las filas que se encuentra a las izquierdas de la coma y a la derecha las columnas.

Pero no es necesario conocer índice de una determinada columna para seleccionarla, ya que los corchetes se pueden utilizar como poniendo el nombre de la columna como se ve a continuación.

airbnb[1:4,"id"]
## [1] 2539 2595 3647 3831

si queremos extraer y operar sobre columnas individuales de una tabla se utiliza el signo $.

airbnb$id # las 5 primeras filas 

Ahora con la función str() veremos cómo están compuestas las columnas si son numéricas o factor, como también veremos la cantidad de variables y observaciones que posee la data.

str(airbnb)
## 'data.frame':    48895 obs. of  16 variables:
##  $ id                            : int  2539 2595 3647 3831 5022 5099 5121 5178 5203 5238 ...
##  $ name                          : chr  "Clean & quiet apt home by the park" "Skylit Midtown Castle" "THE VILLAGE OF HARLEM....NEW YORK !" "Cozy Entire Floor of Brownstone" ...
##  $ host_id                       : int  2787 2845 4632 4869 7192 7322 7356 8967 7490 7549 ...
##  $ host_name                     : chr  "John" "Jennifer" "Elisabeth" "LisaRoxanne" ...
##  $ neighbourhood_group           : chr  "Brooklyn" "Manhattan" "Manhattan" "Brooklyn" ...
##  $ neighbourhood                 : chr  "Kensington" "Midtown" "Harlem" "Clinton Hill" ...
##  $ latitude                      : num  40.6 40.8 40.8 40.7 40.8 ...
##  $ longitude                     : num  -74 -74 -73.9 -74 -73.9 ...
##  $ room_type                     : chr  "Private room" "Entire home/apt" "Private room" "Entire home/apt" ...
##  $ price                         : int  149 225 150 89 80 200 60 79 79 150 ...
##  $ minimum_nights                : int  1 1 3 1 10 3 45 2 2 1 ...
##  $ number_of_reviews             : int  9 45 0 270 9 74 49 430 118 160 ...
##  $ last_review                   : chr  "2018-10-19" "2019-05-21" "" "2019-07-05" ...
##  $ reviews_per_month             : num  0.21 0.38 NA 4.64 0.1 0.59 0.4 3.47 0.99 1.33 ...
##  $ calculated_host_listings_count: int  6 2 1 1 1 1 1 1 1 4 ...
##  $ availability_365              : int  365 355 365 194 0 129 0 220 0 188 ...

Podemos observar a grandes rasgos que las variables room_type posee 3 niveles., que existe datos vacíos NA en la variable reviews_per_month y que neighbourhood posee 221 niveles.

Ahora veremos si existen datos vacíos en la data con la función sapply() y para buscar los datos vacíos en se utiliza is.na().

sapply(airbnb, function(airbnb) sum(is.na(airbnb)))
##                             id                           name 
##                              0                              0 
##                        host_id                      host_name 
##                              0                              0 
##            neighbourhood_group                  neighbourhood 
##                              0                              0 
##                       latitude                      longitude 
##                              0                              0 
##                      room_type                          price 
##                              0                              0 
##                 minimum_nights              number_of_reviews 
##                              0                              0 
##                    last_review              reviews_per_month 
##                              0                          10052 
## calculated_host_listings_count               availability_365 
##                              0                              0

Observamos que en las variables reviews_per_month posee 10052 datos vacíos y para ver los datos vacíos es lo mismo, pero con is.null().

sapply(airbnb, function(airbnb) sum(is.null(airbnb)))
##                             id                           name 
##                              0                              0 
##                        host_id                      host_name 
##                              0                              0 
##            neighbourhood_group                  neighbourhood 
##                              0                              0 
##                       latitude                      longitude 
##                              0                              0 
##                      room_type                          price 
##                              0                              0 
##                 minimum_nights              number_of_reviews 
##                              0                              0 
##                    last_review              reviews_per_month 
##                              0                              0 
## calculated_host_listings_count               availability_365 
##                              0                              0

No existe datos nulos en la data como se puede observar. Ahora para eliminar los datos vacíos observados anteriormente.

airbnb <- airbnb[!is.na(airbnb$reviews_per_month),] 

Veremos si las observaciones fueron eliminadas.

nrow(airbnb)
## [1] 38843

5.4.3 Exploración de las variables

Realizaremos la exploración de la variable ID, lo primero que veremos si los datos de esta variable son datos únicos, para ello crearemos la data id y usaremos la función select() que nos ayudara seleccionar la base y las variables que deseamos observar, y además utilizaremos la función unique para ver si son únicas en su valor.

id <- select(airbnb, id) %>% unique
nrow(id)
## [1] 38843

La data tiene 48895 datos y la columna ID igual por lo que no existen datos repetidos.

Con la variable name veremos si existen datos vacíos en la data y cual es id de estos datos vacíos.

airbnb%>% 
  select(id, name)%>% 
  filter (is.na (name))
## [1] id   name
## <0 rows> (or 0-length row.names)

No existe datos vacíos. Ahora siguiéremos saber el nombre especifico de un id, usaremos el mismo código anterior, pero en la función filter colocamos id == que representa el igual y el id que deseamos buscar en este caso es el 2232600..

airbnb%>% 
  select(id, name)%>% 
  filter (id == "2232600")
##        id name
## 1 2232600

Como observamos no existe nombre, esto demuestra a a veces es bueno realizar más de una revisión. para solucionar estos problemas remplazaremos los datos en blanco por No .

airbnb$name[airbnb$name == ""] <- "No"
airbnb%>% 
  select(id, name)%>%
  filter(is.na (name))
## [1] id   name
## <0 rows> (or 0-length row.names)

Antes de eliminarlo tenemos que ver si estos datos son relevantes para nuestro estudio y si esas variables la utilizaremos más adelante.

airbnb$host_name[airbnb$host_name == ""] <- "No"

Ahora veremos la variable neighbourhood_group cuales son los niveles de esta variable.

neighbourhood_group <- select(airbnb, neighbourhood_group) %>% unique 
neighbourhood_group
##     neighbourhood_group
## 1              Brooklyn
## 2             Manhattan
## 47               Queens
## 170       Staten Island
## 172               Bronx

Vemos que son 5 distritos. Y en cuento a la variable neighbourhood con el mismo condigo anterior.

neighbourhood <- select(airbnb, neighbourhood) %>% unique 
neighbourhood
##                    neighbourhood
## 1                     Kensington
## 2                        Midtown
## 4                   Clinton Hill
## 5                    East Harlem
## 6                    Murray Hill
## 7             Bedford-Stuyvesant
## 8                 Hell's Kitchen
## 9                Upper West Side
## 10                     Chinatown
## 13                   South Slope
## 15                  West Village
## 16                  Williamsburg
## 17                   Fort Greene
## 18                       Chelsea
## 19                 Crown Heights
## 22                    Park Slope
## 26               Windsor Terrace
## 29                        Inwood
## 30                  East Village
## 31                        Harlem
## 33                    Greenpoint
## 38                      Bushwick
## 40               Lower East Side
## 46     Prospect-Lefferts Gardens
## 47              Long Island City
## 55                      Kips Bay
## 60                          SoHo
## 63               Upper East Side
## 64              Prospect Heights
## 74            Washington Heights
## 78                      Woodside
## 84                      Flatbush
## 86              Brooklyn Heights
## 102              Carroll Gardens
## 110                      Gowanus
## 137                    Flatlands
## 143                  Cobble Hill
## 144                     Flushing
## 159                  Boerum Hill
## 162                    Sunnyside
## 164                        DUMBO
## 170                   St. George
## 172                   Highbridge
## 175           Financial District
## 182                    Ridgewood
## 183          Morningside Heights
## 197                      Jamaica
## 200               Middle Village
## 212                         NoHo
## 219             Ditmars Steinway
## 224            Flatiron District
## 228             Roosevelt Island
## 235            Greenwich Village
## 242                 Little Italy
## 247                East Flatbush
## 250                Tompkinsville
## 258                      Astoria
## 262                  Eastchester
## 310                  Kingsbridge
## 343                  Two Bridges
## 361               Queens Village
## 368               Rockaway Beach
## 404                 Forest Hills
## 420                       Nolita
## 434                     Woodlawn
## 485           University Heights
## 495                     Gramercy
## 511                     Allerton
## 522                East New York
## 554             Theater District
## 558            Concourse Village
## 561               Sheepshead Bay
## 572                 Emerson Hill
## 576                Fort Hamilton
## 578                  Bensonhurst
## 588                      Tribeca
## 599                  Shore Acres
## 609                  Sunset Park
## 611                    Concourse
## 651                     Elmhurst
## 672               Brighton Beach
## 684              Jackson Heights
## 695                Cypress Hills
## 699                   St. Albans
## 703                     Arrochar
## 737                    Rego Park
## 738                    Wakefield
## 867                      Clifton
## 884                    Bay Ridge
## 958                 Graniteville
## 967               Spuyten Duyvil
## 968                    Stapleton
## 975                    Briarwood
## 976                   Ozone Park
## 977                  Columbia St
## 1034                Vinegar Hill
## 1061                  Mott Haven
## 1070                    Longwood
## 1071                    Canarsie
## 1109           Battery Park City
## 1140                Civic Center
## 1163               East Elmhurst
## 1179             New Springville
## 1194              Morris Heights
## 1328                     Arverne
## 1341                   Gravesend
## 1425                 Tottenville
## 1508             Mariners Harbor
## 1558                     Concord
## 1608                Borough Park
## 1689                     Bayside
## 1690           Downtown Brooklyn
## 1725                 Port Morris
## 1750                   Fieldston
## 1803                 Kew Gardens
## 1872                     Midwood
## 1883               College Point
## 1966                  Mount Eden
## 2106                 City Island
## 2195                    Glendale
## 2259                    Red Hook
## 2442               Richmond Hill
## 2828                     Maspeth
## 2840               Port Richmond
## 2931              Williamsbridge
## 2984                   Soundview
## 3021                   Woodhaven
## 3051                  Co-op City
## 3102             Stuyvesant Town
## 3240                 Parkchester
## 3350             North Riverdale
## 3396               Dyker Heights
## 3440                   Bronxdale
## 3762                    Sea Gate
## 3810                   Riverdale
## 3825           Kew Gardens Hills
## 3965                 Bay Terrace
## 4036                     Norwood
## 4141           Claremont Village
## 4167                  Whitestone
## 4227                     Fordham
## 4374                   Bayswater
## 4478                   Navy Yard
## 4805                 Brownsville
## 4862                 Eltingville
## 5218                  Mount Hope
## 5467                Clason Point
## 5546             Lighthouse Hill
## 5612         Springfield Gardens
## 5841                Howard Beach
## 5994                Belle Harbor
## 6054             Jamaica Estates
## 6109                    Van Nest
## 6369                   Bellerose
## 6539               Fresh Meadows
## 6933                 Morris Park
## 6942               West Brighton
## 7135                Far Rockaway
## 7226            South Ozone Park
## 7227                     Tremont
## 7301                      Corona
## 7770                 Great Kills
## 8019             Manhattan Beach
## 8289                 Marble Hill
## 8783                Dongan Hills
## 9564             East Morrisania
## 9764                 Hunts Point
## 9987                    Neponsit
## 10133                 Pelham Bay
## 10261              Randall Manor
## 10711                Throgs Neck
## 10723                  Todt Hill
## 10735                 West Farms
## 10835                Silver Lake
## 11212                  Laurelton
## 11624                Grymes Hill
## 11739                 Holliswood
## 11895             Pelham Gardens
## 12766                   Rosedale
## 13683          Castleton Corners
## 13738                   Edgemere
## 13816               New Brighton
## 14236                 Baychester
## 14749                    Melrose
## 15431               Bergen Beach
## 15778            Cambria Heights
## 16036               Richmondtown
## 17313               Howland Hook
## 17398              Schuylerville
## 17596               Coney Island
## 18445               Prince's Bay
## 18519                South Beach
## 19110                 Bath Beach
## 19470              Midland Beach
## 19556              Jamaica Hills
## 19900                    Oakwood
## 20197                Castle Hill
## 21630                 Douglaston
## 21848                   Huguenot
## 22282                   Edenwald
## 22311                    Belmont
## 22595                 Grant City
## 23450                Westerleigh
## 23868                 Morrisania
## 25147 Bay Terrace, Staten Island
## 25189         Westchester Square
## 25292                Little Neck
## 25862                   Rosebank
## 25881                  Unionport
## 26236                 Mill Basin
## 26403                     Hollis
## 29605              Arden Heights
## 29739                Bull's Head
## 30608                  Olinville
## 33262                  Rossville
## 33699               Breezy Point
## 34162                Willowbrook
## 34939             New Dorp Beach

Con la variable price veremos el promedio , máximo, varianza y mínimo.

summarise(airbnb, mean = mean(price), variance = var(price), min = min(price), max = max(price))
##       mean variance min   max
## 1 142.3179 38787.58   0 10000

El mínimo es 0 por que existen hospedaje con precio 0 esto es ilógico para una empresa por lo que se busca identificar cuáles son estos datos.

airbnb%>% 
  select(id, price)%>% 
  filter (price == "0")
##          id price
## 1  18750597     0
## 2  20333471     0
## 3  20523843     0
## 4  20608117     0
## 5  20624541     0
## 6  20639628     0
## 7  20639792     0
## 8  20639914     0
## 9  21291569     0
## 10 21304320     0

Son 10 datos y como los ID son datos únicos se entiende que estos datos no se repitieran. esta columna es relevante por lo que se elimina los 11 datos nulos.

airbnb <-airbnb [airbnb$price!="0",] #elimina los 0
summarise(airbnb, mean = mean(price), variance = var(price), min = min(price), max = max(price))
##       mean variance min   max
## 1 142.3546 38792.35  10 10000

Con la variable minimum_nights.

summarise(airbnb, mean = mean(minimum_nights), variance = var(minimum_nights), min = min(minimum_nights), max = max(minimum_nights))
##       mean variance min  max
## 1 5.867561 302.2754   1 1250

Existen máximos con más de 365 días por lo que se determina que no es coherente por lo que se elimina las celdas mayores a 365.

nrow(filter(airbnb, minimum_nights>=366))
## [1] 6

cuando queremos eliminar observaciones especificas utilizaos el siguiente código.

airbnb<-airbnb[!(airbnb$minimum_nights %in% c("999","370","1000","1250","500","480","500","999","500","366","999","400","990","500")),]

Se elimina para no afectar la data y verificamos.

summarise(airbnb, mean = mean(minimum_nights), variance = var(minimum_nights), min = min(minimum_nights), max = max(minimum_nights))
##      mean variance min max
## 1 5.74953 195.6422   1 365

Ahora veremos la variable number_of_reviews.

summarise(airbnb, mean = mean(number_of_reviews), variance = var(number_of_reviews), min = min(number_of_reviews), max = max(number_of_reviews))
##       mean variance min max
## 1 29.29801 2322.392   1 629